﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using Npgsql;
using System.Data;

namespace SIGEB.Modelo.moduloUsuarios
{
    public class conjuntoUsuarios:conjuntoBase
    {
        #region "constructores"

        public conjuntoUsuarios(datosAplicacion dA)
            : base(dA)
        {
            numTipo = CONJUSUARIOS;
        }

        #endregion

        #region "metodos"

        public override object obtenerEstado()
        {
            throw new NotImplementedException();
        }  

        #region "imec"

        public void agregarusuario(usuario nuevoUsu)
        {
            try
            {
                compConexion.Open();
            }
            catch (Exception e)
            {
                throw new Exception("Error al conectar con la base de datos\n" + e.Message);
            }
            try
            {
                string sql = "SELECT registrar_usuario('" + nuevoUsu.idUsuario + "', '" + nuevoUsu.cedula + "', '" + nuevoUsu.nombre +
                    "', '" + nuevoUsu.apellido1 + "', '" + nuevoUsu.apellido2 + "', " + nuevoUsu.mujer + ", '" + nuevoUsu.domicilio + "', '" +
                    nuevoUsu.email + "', '" + nuevoUsu.telefono + "', " + nuevoUsu.estado + ", '" + nuevoUsu.idGrupo + "', '" + nuevoUsu.permisos + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
            }
            catch(Exception e)
            {
                throw new Exception(e.Message + "\nError al agregar usuario: " + nuevoUsu.idUsuario);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            notificar(this.numTipo, null);
        }

        public void eliminarusuario(String codusuario)
        {
            try
            {
                compConexion.Open();
            }
            catch (Exception e)
            {
                throw new Exception("Error al conectar con la base de datos\n" + e.Message);
            }
            try
            {
                string sql = "SELECT eliminar_usuario('" + codusuario + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
            }
            catch
            {
                throw new Exception("Error al eliminar usuario: " + codusuario);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            notificar(this.numTipo, null);
        }

        public void modificarusuario(String codusuario, usuario nuevoUsu)
        {
            try
            {
                compConexion.Open();
            }
            catch (Exception e)
            {
                throw new Exception("Error al conectar con la base de datos\n" + e.Message);
            }
            try
            {
                string sql = "SELECT actualizar_usuario('" + nuevoUsu.idUsuario + "', '" + nuevoUsu.cedula + "', '" + nuevoUsu.nombre +
                    "', '" + nuevoUsu.apellido1 + "', '" + nuevoUsu.apellido2 + "', " + nuevoUsu.mujer + ", '" + nuevoUsu.domicilio + "', '" +
                    nuevoUsu.email + "', '" + nuevoUsu.telefono + "', " + nuevoUsu.estado + ", '" + nuevoUsu.idGrupo + "', '" + nuevoUsu.permisos + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
            }
            catch(Exception e)
            {
                throw new Exception(e.Message + "\nError al modificar usuario: " + nuevoUsu.idUsuario);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            notificar(this.numTipo, null);
        }

        public void modificarPassword(string idUsuario, string password)
        {
            try
            {
                compConexion.Open();
            }
            catch (Exception e)
            {
                throw new Exception("Error al conectar con la base de datos\n" + e.Message);
            }
            try
            {
                string sql = "SELECT set_password_usuario('" + idUsuario + "', '" + password + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                ds.Reset();
                da.Fill(ds);
                dt = ds.Tables[0];
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al modificar usuario: " + idUsuario);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch{}
            }
            notificar(this.numTipo, null);
        }

        public void desactivarUsuario(string idUsuario)
        {
            throw new NotImplementedException();
        }

        public usuario obtenerusuario(String codusuario)
        {
            usuario nueva = null;
            try
            {
                compConexion.Open();
            }
            catch (Exception e)
            {
                throw new Exception("Error al conectar con la base de datos\n" + e.Message);
            }
            try
            {
                
                string sql = "SELECT * FROM consultar_usuario_id('" + codusuario + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 13);
                    try
                    {
                        nueva = new usuario(valores[0], valores[1], valores[2], valores[3], valores[4], bool.Parse(valores[5]),
                            valores[6], valores[7], valores[8], valores[9], int.Parse(valores[10]), valores[11], valores[12]);
                    }
                    catch { }
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener el usuario " + codusuario);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            return nueva;
        }

        public LinkedList<usuario> obtenerTodos()
        {
            LinkedList<usuario> nueva = new LinkedList<usuario>();
            try
            {
                compConexion.Open();
            }
            catch (Exception e)
            {
                throw new Exception("Error al conectar con la base de datos\n" + e.Message);
            }
            try
            {
                
                string sql = "SELECT * FROM consultar_usuario()";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 13);
                    nueva.AddLast(new usuario(valores[0], valores[1], valores[2], valores[3], valores[4], bool.Parse(valores[5]),
                        valores[6], valores[7], valores[8], valores[9], int.Parse(valores[10]), valores[11], valores[12]));
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener usuarios ");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            return nueva;     
        }

        public LinkedList<usuario> usuariosGrupo(string idGrupo)
        {
            LinkedList<usuario> nueva = new LinkedList<usuario>();
            try
            {
                compConexion.Open();
            }
            catch (Exception e)
            {
                throw new Exception("Error al conectar con la base de datos\n" + e.Message);
            }
            try
            {
                
                string sql = "SELECT * FROM consultar_usuarios_grupo('" + idGrupo + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 13);
                    nueva.AddLast(new usuario(valores[0], valores[1], valores[2], valores[3], valores[4], bool.Parse(valores[5]),
                        valores[6], valores[7], valores[8], valores[9], int.Parse(valores[10]), valores[11], valores[12]));
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener usuarios ");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            return nueva;
        }

        public LinkedList<usuario> morosos()
        {
            LinkedList<usuario> nueva = new LinkedList<usuario>();
            try
            {
                compConexion.Open();
            }
            catch (Exception e)
            {
                throw new Exception("Error al conectar con la base de datos\n" + e.Message);
            }
            try
            {
                
                string sql = "SELECT * FROM usuarios_morosos()";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 13);
                    nueva.AddLast(new usuario(valores[0], valores[1], valores[2], valores[3], valores[4], bool.Parse(valores[5]),
                        valores[6], valores[7], valores[8], valores[9], int.Parse(valores[10]), valores[11], valores[12]));
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener usuarios ");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            return nueva;
        }

        public LinkedList<usuario> conMulta()
        {
            LinkedList<usuario> nueva = new LinkedList<usuario>();
            try
            {
                compConexion.Open();
            }
            catch (Exception e)
            {
                throw new Exception("Error al conectar con la base de datos\n" + e.Message);
            }
            try
            {
                
                string sql = "SELECT * FROM usuarios_multas()";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 13);
                    nueva.AddLast(new usuario(valores[0], valores[1], valores[2], valores[3], valores[4], bool.Parse(valores[5]),
                        valores[6], valores[7], valores[8], valores[9], int.Parse(valores[10]), valores[11], valores[12]));
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener usuarios ");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            return nueva;
        }

        #endregion

        #endregion
    }
}
